<?php

/**
 * Smarty plugin
 * @package Smarty
 * @subpackage plugins
 */

/**
 * Smarty truncate modifier plugin
 *
 * Type:     modifier<br>
 * Name:     truncate<br>
 * Purpose:  Truncate a string to a certain length if necessary,
 *           optionally splitting in the middle of a word, and
 *           appending the $etc string or inserting $etc into the middle.
 * @link http://smarty.php.net/manual/en/language.modifier.truncate.php
 *          truncate (Smarty online manual)
 * @author   Monte Ohrt <monte at ohrt dot com>
 * @param string
 * @param integer
 * @param string
 * @param boolean
 * @param boolean
 * @return string
 */
function smarty_modifier_truncate_cn($string, $length = 80, $etc = '...', $break_words = false, $middle = false) {
    
//    if ($length == 0)
//        return '';
//
//    if (strlen($string) > $length) {
//        $length -= min($length, strlen($etc));
//        if (!$break_words && !$middle) {
//            $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
//        }
//        if(!$middle) {
//            return substr($string, 0, $length) . $etc;
//        } else {
//            return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
//        }
//    } else {
//        return $string;
//    }
//    
//    $string = htmlspecialchars_decode($string);
    $string = str_replace(array(' ', '&nbsp;', '&amp;', '&quot;', '&#039;', '&ldquo;', '&rdquo;', '&mdash;', '&lt;', '&gt;', '&middot;', '&hellip;'), array('∵', ' ', '&', '"', "'", '“', '”', '—', '<', '>', '·', '…'), $string);
    if (utf8_strlen($string) > $length) {
        $string = mb_substr($string, 0, $length, 'utf-8') . $etc;

    }
    $string = str_replace(array('∵', '&', '"', "'", '“', '”', '—', '<', '>', '·', '…'), array(' ', '&amp;', '&quot;', '&#039;', '&ldquo;', '&rdquo;', '&mdash;', '&lt;', '&gt;', '&middot;', '&hellip;'), $string);
    return $string;
}

function utf8_strlen($str) {
//    $str = htmlspecialchars_decode($str);
    if (empty($str)) {
        return 0;
    }
    $str = trim($str);
    //获取字符串长度，中文会计算为3个字符。
    $len = strlen($str);
    $mb_len = 0;
    $char = '';
    //循环每个字符
    for ($i = 0; $i < $len; $i++) {
        $char = substr($str, $i, 1);
        //如果当前字符不在基础ASCII码中就认为是中文，与其后的2个字符一起被计算作一个字。
        if (ord($char) > 127) {
            $i = $i + 2;
            $mb_len++;
            continue;
        }
        $mb_len++;
    }
    return $mb_len;
}

/* vim: set expandtab: */
?>
